c++ 您所在的位置:网站首页 opengl错误1282invalid operation c++

c++

2024-07-12 13:33| 来源: 网络整理| 查看: 265

我正在尝试为我当前的简单立方体场景添加照明。设置好制服后,这段代码的 glGetError() 出现 1282 错误

GLuint ambientHandle = glGetUniformLocation(program->getHandle(), "ambientProduct"); glUniform4fv( ambientHandle, 1, ambientProduct ); GLuint diffuseHandle = glGetUniformLocation(program->getHandle(), "diffuseProduct"); glUniform4fv( diffuseHandle, 1, diffuseProduct ); GLuint specularHandle = glGetUniformLocation(program->getHandle(), "specularProduct"); glUniform4fv( specularHandle, 1, specularProduct ); GLuint lightPosHandle = glGetUniformLocation(program->getHandle(), "lightPosition"); glUniform4fv( lightPosHandle, 1, light.position ); GLuint shinyHandle = glGetUniformLocation(program->getHandle(), "shininess"); glUniform1f( shinyHandle, materialShininess );

这是我的着色器: 顶点.glsl

#version 120 attribute vec4 coord3d; attribute vec3 normal3d; // output values that will be interpretated per-fragment varying vec3 fN; varying vec3 fE; varying vec3 fL; uniform vec4 lightPosition; uniform mat4 mTransform; void main() { fN = normal3d; fE = coord3d.xyz; fL = lightPosition.xyz; if( lightPosition.w != 0.0 ) { fL = lightPosition.xyz - coord3d.xyz; } gl_Position = mTransform*coord3d; }

片段.glsl

// per-fragment interpolated values from the vertex shader varying vec3 fN; varying vec3 fL; varying vec3 fE; uniform vec4 ambientProduct, diffuseProduct, specularProduct; uniform mat4 mTransform; uniform vec4 lightPosition; uniform float shininess; void main() { // Normalize the input lighting vectors vec3 N = normalize(fN); vec3 E = normalize(fE); vec3 L = normalize(fL); vec3 H = normalize( L + E ); vec4 ambient = ambientProduct; float Kd = max(dot(L, N), 0.0); vec4 diffuse = Kd*diffuseProduct; float Ks = pow(max(dot(N, H), 0.0), shininess); vec4 specular = Ks*specularProduct; // discard the specular highlight if the light's behind the vertex if( dot(L, N) < 0.0 ) { specular = vec4(0.0, 0.0, 0.0, 1.0); } gl_FragColor = ambient + diffuse + specular; gl_FragColor.a = 1.0; }

products 和 position 都是三个 GLfloats 的结构体,shininess 是一个 float 。我检查了句柄的所有值和我传递的值,它们似乎都是有效的。想法?

--编辑: 我已将其范围缩小到 glUniform4fv 调用。它发生在每一个之后。我还仔细检查了 program->getHandle() 是否指向看起来有效的东西。

我已经检查了程序->getHandle 是一个有效的程序 以下是所有句柄的值: 程序句柄 3 环境句柄 0 扩散 handle 1 镜面 handle 5 lightPosHandle 2 Shiny handle 4

所以它们看起来都很好。为了测试,我将注释掉环境产品下面的行。为清楚起见,我明确地使用了这一行

glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w );

这些是执行该行时ambientProd 的值。 x = 0.200000003, y = 0.0, z = 0.200000003, w = 1.0

该项目的一位合作者提出了 glUseProgram 的呼吁。谢谢大家的帮助。

最佳答案

错误号“1282”的描述性不是很好。

glGetUniformLocation 的可能错误代码是:

GL_INVALID_VALUE GL_INVALID_OPERATION

没有固定值。尝试使用 gluErrorString() 获取错误字符串,或查看 header 中哪些 1282 映射。

只是在黑暗中拍摄:但是你...

检查你的着色器编译没有错误?

检查您的着色器是否正确链接?

顺便说一句:返回类型是 GLint 而不是 GLuint

“着色器编译和链接没有错误”嗯,这看起来很奇怪。

根据规范(参见:http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml)GL_INVALID_OPERATION 仅应在以下情况下生成:

程序不是程序对象

程序未成功链接

其他问题:

您确定您的 program 对象所属的类的 getHandle() 方法返回正确的 id。我的意思是在成功链接中使用的那个。

您应该能够通过检查 glIsProgram(program-getHandle()) 是否返回 GL_TRUE

来验证

编辑:啊 - 在你的例子中,我错过了那些对 glUniform4fv 的调用。

glGetUniformLocation 的正确返回类型仍然是 GLint,但我认为这不是问题。

根据规范(参见:http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml)GLUniformXX 生成 GL_INVALID_OPERATION 的原因有很多。对我来说,唯一可能适用的是:

没有当前程序对象

在尝试调用 glUniform() 之前,您是否调用了 glUseProgram (program->getHandle())?

关于c++ - OpenGL 着色器错误 1282,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15722803/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有